package com.skiving.cloud.file.service;

import com.mybatisflex.core.paginate.Page;
import com.skiving.cloud.auth.entity.AuthUser;
import com.skiving.cloud.common.utils.PageParameter;
import com.mybatisflex.core.service.IService;
import com.skiving.cloud.file.entity.SysFile;
import org.noear.solon.core.handle.Context;
import org.noear.solon.core.handle.UploadedFile;

import java.io.InputStream;
import java.util.List;
import java.util.Map;

/**
 * 附件 服务层。
 *
 * @author skivingcloud
 * @since 2025-03-14
 */
public interface SysFileService extends IService<SysFile> {
    /**
     * 分页查询附件
     *
     * @param parameter 查询参数
     * @return 分页查询结果
     */
    Page<SysFile> queryByPage(PageParameter<SysFile> parameter);

    /**
     * 上传添加文件
     * @param files 文件
     * @param businessId 业务id
     * @param user 用户
     * @param belongModule 模块
     * @return 文件id
     */
    List<String> saveFiles(UploadedFile[] files, String businessId, AuthUser user, String belongModule) throws Exception;

    /**
     * 下载文件
     * @param fileManagement 文件
     * @param ctx response
     */
    void downloadFile(SysFile fileManagement, Context ctx) throws Exception;

    /**
     * 返回文件字节
     *
     * @param fileManagement 文件对象
     * @return 字节流
     * @throws Exception 异常
     */
    byte[] getByte(SysFile fileManagement) throws Exception;

    /**
     * 将文件移动至“已删除”目录
     *
     * @param asList 文件id
     * @param userId 用户
     * @param fileState 状态
     * @throws Exception 异常
     */
    void moveFilePath(List<String> asList, String userId, String fileState) throws Exception;

    /**
     * 根据业务id查询附件信息
     *
     * @param businessId 业务id
     * @return 文件列表
     */
    List<SysFile> getFileListByBusId(String businessId);

    /**
     * 根据业务id查询附件数量
     *
     * @param busIds 业务id数组
     * @return 数量
     */
    List<Map> getFileCountByBusId(String[] busIds);

    /**
     * 保存文件流
     * @param inputStream 文件流
     * @param businessId 业务id
     * @param userId 用户
     * @param belongModule 模块
     * @param fileName 文件名
     * @param extension 后缀
     * @return 文件id
     */
    String saveFileInputStream(InputStream inputStream, String businessId, String userId, String belongModule, String fileName, String extension) throws Exception;
}
